
import os
from PIL import Image
from numpy import *
from pylab import *

def process_image(imagename, resultname, params="--edge-thresh 10 --peak-thresh 5"):
    """
    输出的文件：每一行前四个量为特征坐标、缩放、旋转角度，后面跟着128个特征描述符。
       """
    if imagename[-3:] !='pgm':
        #创建一个pgm文件
        im=Image.open(imagename).convert('L')
        im.save('tmp.pgm')
        imagename=r'tmp.pgm'
    cmd=str(r'VLFeat\win64\sift.exe '+imagename+' --output='+resultname+" "+params)
    os.system(cmd)
    print(cmd)
    print( 'processed %s to %s'%(imagename,resultname))

def read_features_from_file(filename):
    """读取特征属性（方位和描述子），并以矩阵的形式返回"""
    f=loadtxt(filename)
    return f[:,:4],f[:,4:]

def write_features_to_file(filename, locs, desc):
    """保存特征位置及描述符到文件"""
    savetxt(filename,hstack(locs,desc))

def plot_features(im,locs,circle=False):
    """显示图像及其特征
    输入：图像，locs(每个特征的行，列，大小，方向）
    """
    def draw_circle(c,r):
        t=arange(0,1.01, .01)*2*pi
        x=r*cos(t)+c[0]
        y=r*sin(t)+c[1]
        plot(x,y,'b',linewidth=2)
    imshow(im)
    if circle:
        for p in locs:
            draw_circle(p[:2],p[2])
    else:
        plot(locs[:,0],locs[:1],'ob')
    axis('off')


################test######################
imname = 'misc_pic/empire.jpg'
im=array(Image.open(imname).convert('L'))
process_image(imname,'empire.sift') #处理图像，得到SIFT信息
loc,desc=read_features_from_file('empire.sift')
figure()
gray()
plot_features(im,loc,circle=True)
show()


process_image('misc_pic/empire.jpg','test.pgm')
x=read_features_from_file('test.pgm')